package com.ww.util.httpclient;

import org.apache.hc.client5.http.ClientProtocolException;
import org.apache.hc.client5.http.classic.methods.HttpGet;
import org.apache.hc.client5.http.impl.classic.CloseableHttpClient;
import org.apache.hc.client5.http.impl.classic.CloseableHttpResponse;
import org.apache.hc.client5.http.impl.classic.HttpClients;
import org.apache.hc.client5.http.protocol.HttpClientContext;
import org.apache.hc.core5.http.HttpEntity;
import org.apache.hc.core5.http.HttpRequest;
import org.apache.hc.core5.http.io.entity.EntityUtils;

import javax.net.ssl.SSLException;
import javax.net.ssl.SSLHandshakeException;
import java.io.IOException;
import java.io.InterruptedIOException;
import java.net.UnknownHostException;

/**
 * Http请求工具类
 */
public class HttpRequestUtils {
//    // 全局连接池对象
//    private static final PoolingHttpClientConnectionManager connManager = new PoolingHttpClientConnectionManager();
//
//    static {
//        // 设置最大连接数
//        connManager.setMaxTotal(200);
//        // 设置每个连接的路由数
//        connManager.setDefaultMaxPerRoute(20);
//    }
//
//    /**
//     * 获取Http客户端连接对象
//     * @param timeout
//     * @return
//     */
//    public static CloseableHttpClient getHttpClient(Integer timeout) {
//        // 创建Http请求配置参数
//        RequestConfig requestConfig = RequestConfig.custom()
//                // 获取连接超时时间
//                .setConnectionRequestTimeout(timeout)
//                // 请求超时时间
//                .setConnectTimeout(timeout)
//                // 响应超时时间
//                .setSocketTimeout(timeout)
//                .build();
//
//        HttpRequestRetryHandler retryHandler = (exception, executionCount, context) -> {
//            // 如果已经重试了3次，就放弃
//            if (executionCount >= 3) {
//                return false;
//            }
//            // 如果服务器丢掉了连接，重试
//            if (exception instanceof NoHttpResponseException) {
//                return true;
//            }
//            // 不要重试SSL握手异常
//            if (exception instanceof SSLHandshakeException) {
//                return false;
//            }
//            // 超时
//            if (exception instanceof InterruptedIOException) {
//                return true;
//            }
//            // 目标服务器不可达
//            if (exception instanceof UnknownHostException) {
//                return false;
//            }
//            // 连接被拒绝
//            if (exception instanceof ConnectTimeoutException) {
//                return false;
//            }
//            // SSL握手异常
//            if (exception instanceof SSLException) {
//                return false;
//            }
//            HttpClientContext clientContext = HttpClientContext.adapt(context);
//            HttpRequest request = clientContext.getRequest();
//            if (!(request instanceof HttpEntityEnclosingRequest)) {
//                return true;
//            }
//            return false;
//        };
//
//        return HttpClients.custom()
//                // 把请求相关的超时信息设置到连接客户端
//                .setDefaultRequestConfig(requestConfig)
//                // 把请求重试设置到连接客户端
//                .setRetryHandler(retryHandler)
//                // 配置连接池管理对象
//                .setConnectionManager(connManager)
//                .build();
//    }
//
//    public static String httpGet(String url, Integer timeout) {
//        String msg = "-1";
//        CloseableHttpClient httpClient = getHttpClient(timeout);
//        HttpGet httpGet = new HttpGet(url);
//        CloseableHttpResponse response = null;
//        try {
//            response = httpClient.execute(httpGet);
//            HttpEntity entity = response.getEntity();
////            msg = EntityUtils.toString(entity, "UTF-8");
//        } catch (ClientProtocolException e) {
//            throw new RuntimeException(e);
//        } catch (IOException e) {
//            throw new RuntimeException(e);
//        } finally {
//            if (null != response) {
//                try {
//                    EntityUtils.consume(response.getEntity());
//                } catch (IOException e) {
//                    throw new RuntimeException(e);
//                }
//            }
//        }
//
//        return msg;
//    }

//    public static void main(String[] args) {
//        System.out.println(httpGet("https://www.baidu.com", 6000));
//    }
}
